/* 
 * BeanUtil.java
 * 
 * Data de criação: 09/04/2010
 * 
 * CORPORATIVO - MTE. 
 *
 */
package br.com.o2solutions.util.bean;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import net.vidageek.mirror.dsl.Mirror;

import org.springframework.beans.BeanUtils;

/**
 * Classe responsável por realizar operacoes uteis relacionando beans java.
 * 
 * @author osvaldeir
 * @since 09/04/2010
 * 
 */
public class BeanUtil {

	/**
	 * Copia as propriedades de um Objeto origem para um destino ignorando
	 * aquelas informadas como parametro. Caso as propriedades a serem ignoradas
	 * sejam nulas nenhuma propriedade sera ignorada.
	 * 
	 * @param source
	 *            Objeto origem
	 * @param target
	 *            Objeto destino
	 * @param ignoreProperties
	 *            String [] propriedades a serem ignoradas.
	 */
	public static void copyProperties(Object source, Object target,
			String[] ignoreProperties) {
		if (ignoreProperties != null) {
			BeanUtils.copyProperties(source, target, ignoreProperties);
		} else {
			BeanUtils.copyProperties(source, target);
		}
	}

	/**
	 * Copia as propriedades de um Objeto origem para um destino ignorando
	 * aquelas que estão nulas (ignoreNullProperties == true).
	 * 
	 * @param source
	 *            Objeto origem
	 * @param target
	 *            Objeto destino
	 * @param ignoreNullProperties
	 *            boolean Booleano que informa se as propriedades nulas serão
	 *            ignoradas.
	 */
	public static void copyProperties(Object source, Object target,
			boolean ignoreNullProperties) {
		List<String> ignoreFields = new ArrayList<String>();
		if (ignoreNullProperties) {
			List<Field> fields = new Mirror().on(source.getClass())
					.reflectAll().fields();
			Iterator<Field> iterator = fields.iterator();
			while (iterator.hasNext()) {
				Field next = iterator.next();
				Object valueOf = new Mirror().on(source).get().field(next);
				if (valueOf == null) {
					ignoreFields.add(next.getName());
				}
			}
		}
		copyProperties(source, target, ignoreFields
				.toArray(new String[ignoreFields.size()]));
	}

	/**
	 * Verifica se o Bean passado e null
	 * 
	 * @param bean
	 *            Bean a ser verificado
	 * @return boolean true se bean == null.
	 */
	public static Boolean isNull(Object bean) {
		return bean == null;
	}
}
